package com.oopdev.io.core.util;
import java.lang.annotation.Annotation;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import com.oopdev.io.core.component.loader.IOComponentMap;
import com.oopdev.io.core.component.loader.IOScopeType;
import com.oopdev.io.core.component.reflects.pojo.IOClass;
import com.oopdev.io.core.exceptions.IOCoreException;
import com.oopdev.io.core.manager.IOAbstractManager;
/**
*
* @author kamilbukum
*
*/
public class IOComponentUtility {
/**
*
* @param manager
* @param clazz
* @return
*/
public static boolean isCanBeComponent(IOAbstractManager manager,Class<?> clazz){
if(clazz==null||manager==null){
return false;
}
Named named=clazz.getAnnotation(Named.class);
if(named==null||named.value()==null)
return false;
return manager.isComponent(clazz);
}
/**
*
* @param manager
* @param clazz
* @return
* @throws IOCoreException
*/
public static boolean addIfItsComponent(IOAbstractManager manager,Class<?> clazz) throws IOCoreException{
if(isCanBeComponent(manager, clazz)){
return false;
}
Map<String, IOClass> componentMap = IOComponentMap.getComponentclassmap().get(manager.getClass().getName());
Named named=clazz.getAnnotation(Named.class);
String name=named.value();
if(componentMap.containsKey(name)){
IOClass ioClass=componentMap.get(name);
if(!ioClass.getClazz().equals(clazz)){
throw new IOCoreException("com.oopdev.io.core.component.loader.IOComponentLoader.loadComponents.duplicate.named.error",new Object[]{named.value(),ioClass.getClazz().getName(),clazz.getName()});
}
}else{
IOClass ioClass= manager.createComponent(name, clazz);
if(ioClass==null){
return false;
}
componentMap.put(name,ioClass);
}
return true;
}
/**
*
* @param clazz
* @return
*/
public static Annotation getCDIScope(Class<?> clazz){
if(clazz==null){
return null;
}else if(clazz.isAnnotationPresent(RequestScoped.class)){
return clazz.getAnnotation(RequestScoped.class);
}else if(clazz.isAnnotationPresent(ConversationScoped.class)){
return clazz.getAnnotation(ConversationScoped.class);
}else if(clazz.isAnnotationPresent(SessionScoped.class)){
return clazz.getAnnotation(SessionScoped.class);
}else if(clazz.isAnnotationPresent(ApplicationScoped.class)){
return clazz.getAnnotation(ApplicationScoped.class);
}
return null;
}
/**
*
* @param ann
* @return
*/
public static IOScopeType getScope(Annotation ann){
if(ann==null) {
return IOScopeType.NONE;
}else if(ann instanceof RequestScoped){
return IOScopeType.REQUEST;
}else if(ann instanceof ConversationScoped){
return IOScopeType.CONVERSATION;
}else if(ann instanceof SessionScoped){
return IOScopeType.SESSION;
}else if(ann instanceof ApplicationScoped){
return IOScopeType.APPLICATION;
}
return IOScopeType.NONE;
}
/**
*
* @param name
* @param clazz
* @return
*/
public static <E> E getComponent(String name,Class<?> clazz){
return null;
}
}